package org.Yiran.timetale_re.item.rune.base;

import java.util.HashMap;
import java.util.Map;

/**
 * 符文注册管理器类
 * <p>
 * 该类负责管理所有符文能力的注册、查询和管理操作。
 * 使用单例模式维护一个全局的符文能力映射表，提供符文能力的注册、获取、检查等操作。
 * 是符文系统的核心注册中心，连接符文类型字符串标识与具体的符文能力实现。
 * </p>
 */
public class RuneRegistry {
    
    // ==============================
    // 实例变量
    // ==============================
    
    /**
     * 存储所有已注册符文能力的映射表
     * <p>
     * 使用符文类型的字符串标识作为键，对应的符文能力实现作为值进行存储。
     * 通过HashMap实现快速查找和注册功能。
     * </p>
     */
    private static final Map<String, RuneAbility> RUNE_ABILITIES = new HashMap<>();
    
    // ==============================
    // 符文注册方法
    // ==============================
    
    /**
     * 注册一个新的符文能力到注册表中
     * <p>
     * 将指定的符文能力实现与其类型标识关联并存储在注册表中。
     * 如果已有相同类型的符文能力存在，新注册的将会覆盖旧的实现。
     * </p>
     *
     * @param ability 需要注册的符文能力实现对象，不能为空
     */
    public static void registerRune(RuneAbility ability) {
        RUNE_ABILITIES.put(ability.getType(), ability);
    }
    
    // ==============================
    // 符文查询方法
    // ==============================
    
    /**
     * 根据符文类型获取对应的符文能力实现
     * <p>
     * 从注册表中查找指定类型的符文能力实现，如果未找到则返回null。
     * </p>
     *
     * @param type 符文类型的字符串标识，如"life"、"storm"等
     * @return 对应的符文能力实现对象，如果未找到则返回null
     */
    public static RuneAbility getRuneAbility(String type) {
        return RUNE_ABILITIES.get(type);
    }
    
    /**
     * 检查是否存在指定类型的符文能力
     * <p>
     * 查询注册表中是否已注册了指定类型的符文能力实现。
     * </p>
     *
     * @param type 待检查的符文类型字符串标识
     * @return 如果存在该类型的符文能力返回true，否则返回false
     */
    public static boolean hasRuneAbility(String type) {
        return RUNE_ABILITIES.containsKey(type);
    }

    // ==============================
    // 辅助管理方法
    // ==============================
    
    /**
     * 获取所有已注册的符文类型及其能力实现的副本
     * <p>
     * 返回当前注册表中所有符文能力的副本映射表，防止外部代码直接修改注册表内容。
     * </p>
     *
     * @return 包含所有已注册符文能力的映射表副本
     */
    public static Map<String, RuneAbility> getRegisteredRunes() {
        return new HashMap<>(RUNE_ABILITIES);
    }

    /**
     * 清空已注册的所有符文能力
     * <p>
     * 清除注册表中的所有符文能力记录，通常用于重新加载或重置符文系统。
     * 注意：此操作不可逆，会丢失所有已注册的符文能力。
     * </p>
     */
    public static void clearRegisteredRunes() {
        RUNE_ABILITIES.clear();
    }
}